\chapter{开发环境}
本章介绍了系统中使用到的一些开发工具和系统环境。
首先介绍了使用的操作系统同时稍微比较了一下linux和windows的各自优缺点。
然后列举了使用的开发工具并没有使用IDE进行开发，IDE是一个很大的进步但
亦有其缺点，并且命令行下的构建工具也是在发展。
这里介绍的工具和windows下的开发方式有较大区别本文只简单介绍使用的工
具不过多的阐明原因，
对于长期使用IDE的朋友可以选择看一下云风的一篇连载文章``IDE不是程序员的
唯一选择''，这里并非争论谁更高效，只是希望每个人都能有机会进行选择。

\section{系统环境}
开发环境是archlinux系统(其他linux系统同样适用)，
Arch Linux的官方介绍很简短:
\begin{quote}
``A lightweight and flexible Linux\textregistered \ distribution that tries to
Keep It Simple.``
\end{quote}
将近5年的日常使用感受是它很符合官方介绍所说的KISS原则，保持linux的简单和灵活。
它不像其他发行版有固定的版本号，archlinux使用pacman和aur进行滚动升级，类似
gentoo的管理方式，但常用软件官方有提供二进制包。可以让你在第一时间使用到最新的
软件版本。

windows和linux的一个很大区别，windows很多工具都比linux下要更加方便
(但一般都是收费软件且价格不菲)。windows下由于主要是靠商业程序来丰富应用因此它上
面的程序一般会比较好用但于其他软件的交互上基本已经让用户错误的认为程序间不需要
什么交流。
linux下则不同大部分软件虽然完成的功能很单一接口也不是很友好，但十分容易和其他
工具结合起来用，用户可以任意选择各种工具组合起来，可以在遇到好用的工具
后将其集成到自己的工作环境中。linux下大部分软件的接口都会有其常用的约定，
比如-s以便代表大小(可能是指示显示文件大小或者是按照文件大小排序)；
-h一般是指human表示使用较友好的输出格式或者是help的意思。
有时候对于第一次使用的工具会在没有看帮助信息的情况下自然的使用到正确的
指令(当然仅仅是非常通用的)。

在linux你可以把绝大部分重复的工作自动化，比如在编写这款软件的时候需要在虚拟机
里面测试windows下的运行情况，需要来回的拷贝编译好的文件到虚拟机去执行。在厌烦
最初的几次拷贝后便编写了几行脚本来完成这个工作，现在只需要进入WIN32目录下make
一下就可以自动编译最新的版本且自动将文件拷贝到windows中。在切换进win系统后就可
以直接运行了(当然也比较容易做到make之后让win下最新的版本自动运行)。

linux也有其不方便的地方比如桌面软件很多情况下需要考虑win下用户的使用造成调试
繁琐；它的图形接口在稳定的前提下没有Windows友好； 
国内大部分商业公司的软件均不支持linux；
完成同一件事情会给你过多的选择(虽然这一点也可以算作优点)，造成刚刚进入某个
领域时对于选择什么工具或技术十分困难。

这里选择linux仅仅是因为长期使用的原因，我个人是很少学习linux系统本身的API。因此
不会使用linux本身的特性，尽量保证程序能做到平台无关。

\section{开发工具}
\subsection{文本编辑器}
在windows下学习编程的同学可能很少有文本编辑器的概念，我在接触linux之前也只了解
记事本这个简陋的软件；Word这种处理文档的工具；VB6.0、Dreamware等集成开发环境。

现在编程语言如此之多，对于一个稍有好奇心的人来说都仅仅使用一种语言是残酷的。
因此如果说现今什么编辑工具最可能支持所有的语言那肯定是非vim和emacs莫属了。
这里选择使用vim作为代码编辑工具原因很简单它是一个优秀的文本编辑器而，并且也只
熟悉这一个文本编辑器。

在软件编写和论文撰写阶段至需要编辑python代码、C++代码(且需要支持刚刚发布的11标
准的部分新语法和工具)、html代码、Javascript代码、CSS代码、latex代码以及CMake的
配置文件。
这仅仅只是在完成这个简单的毕业论文需要应付的语言。而在日常学习生活中需要遇到的
文件类型更是各种各样，仅仅我个人平常需要编辑的文件种类都可以继续列出许多。

如果每种文件都使用特意为其编写的工具来编辑那么在计算机这个日新月异的发展速度下
你在学习某种技术的时候就需要花费一些不必要的额外时间。而使用vim这类工具你
需要的仅仅是在遇到一种新语言或文件的时候在网络上花上十多分钟就能获得不错
的效果。
除了少数通用约定(如ctrl+v，ctrl+z，alt+<F4>之类)你在一个工具上积累的知识
很可能在下一个工具上就不再适用了。 而使用文本编辑器你可以解决任何纯文本格式
的编写问题，你所积累的会越来越多你的效率也会随之提高。
因为其设计理念它不会随着时代的变迁而变的不再适用(至少vim的前身vi的年龄比我
要大)。

vim和emacs在网上已经有很多中文资料我在此就不在这里介绍了。

如果没有vim这样的文本编辑器则在本次论文过程中就很难处理众多的文件格式。

\subsection{编译器}
C++的编译器种类并不多成熟的只有GCC，VC，Intel C++以及新秀clang(Apple主导
研发的基于LLVM的编译器)。
其他如TrubC++、Borland C++由于失去支持我觉得即使作为教学也不该使用。
Intel C++口碑不错但是商业程序，VC2010有express版但只能在win下使用。
clang++对c++11的支持不够多，因此这里选择gcc4.6.2作为主要的工具。
win下的编译工具使用mingw。 win下面使用在发布的时候选用vc++进行编译也许是
更好的选择。

在交叉编译上这里介绍一个叫做mingw cross的项目。这个项目主要是帮助用户在
linux下建立一整套完整的交叉编译工具(仅仅针对win32)和常用的库。通过脚本进行
构造最简单的情况下可以仅仅下载完脚本文件一个make命令后自动下载源代码自动
编译大部分软件库(比如qt，gtk等)，如果手动编译的话会有很多问题而这个项目
通过测试特定版本对有问题的地方给出workaround的path从而大大简化了交叉编译。

\subsection{构建工具}
这里使用CMake进行构建管理。CMake通过读取配置文件CMakeLists。txt来生成makefile
文件。可以方便的进行工程管理。
较老的资料都是介绍GNU的Autotools系列工具，只是这套工具还是稍嫌麻烦，当然
其历史悠久稳定可靠。
但如果不是为了开发完全符合gnu规则的软件则使用CMake是十分好的选择。
另外CMake可以生成其他IDE需要的工程文件比如VS。

如果使用Java语言则Ant是最好的选择了。
还有两款使用python写的C/C++构建工具SCons和Waf也有一定名气。

本次使用CMake来管理项目使编译过程变得十分轻松，不论是交叉编译windows下的可执行
文件还是linux下的可执行文件都只需使用同一份CMakelists。txt进行管理一个make命令
就行了。

\subsection{版本管理}
这里仅仅讨论开源的版本管理软件。
Git是较新的版本管理软件05年才刚开发出来，而我也只是这几年才了解。
Git作者对其名称来源是这样解释的:
\begin{quote}
``I'm an egotistical bastard, and I name all my projects
after. First Linux, now git.''
\end{quote}
从First Linux就知道这句话是Linus Torvalds说的了，他也是git的最初作者。

因为早期使用的商业软件BitKeeper合作到期Linux社区急需一款优秀的版本管
理软件来管理日益庞大的Kernel，所以创造了Git。

这之前最流行的开源CVS是软件要属SVN了，著名的sourceforge就是使用svn
进行代码托管的，Google Code也是， 国内的Sina App Engine也是。
我最初使用的CVS也是svn，但svn需要开启一个服务进程稍显麻烦。
CVS虽然是Concurrent  Versions System的缩写但它同时也是一款历史悠久
的版本管理软件的名称。

使用版本控制几乎已经成为软件开发中必须的一个环节了，特别是git的出现
是部署版本管理的成本几乎为零，你所需要做的仅仅是在命令行下敲入git init
就行了。
在编写代码时候就多次利用git的分支功能进行一些想法上的实践，如果没有
版本控制就必须出现一个想法的时候把源代码复制保存一份以免破坏原有代码。

\subsection{文档工具}
这里使用的latex是指编写本论文的工具，而非软件文档。
如果所写程序属于供他人使用的代码库则可以用doxygen自动生成
文档。
本论文很少涉及到数学公式而且没有现成的模板文件因此使用latex并非是一个
很好的选择，但考虑到linux下使用libreoffice(基本可以认为是OpenOffice)
会在一些细节地方与MS Word不兼容且自身对word类工具使用经验较少。
因此选择latex这类用户不需要关注版式但却能很自动排版的工具。
其中中文宏包使用xeCJK。
利用latex使本次论文的编写不需要关注论文版式上的问题\footnote{当然在没有
模板的情况下还是需要花一定时间去调整版式，因此特意将完成的latex模板放在
github.com上以便以后的同学使用latex编写本校论文不需要关注论文格式。}。
